#ifndef TRAITEMENTREQUETE_HPP
#define TRAITEMENTREQUETE_HPP

#include <QtCore/QObject>

#include <QtNetwork/QNetworkReply>

class RapporteurDeFichier;
class InterpreteXml;
class StructureDonnees;

/** Classe qui permet de traiter une requête réseau.
  * Cette classe permet de réaliser le téléchargement et récupère les
  * informations dans un format utilisable.
  *
  * @author Johan "Solo" Luisier
  * @date Octobre 2011
  */
class TraitementRequete : public QObject
{
    Q_OBJECT
public:
    /** Constructeur standard.
      * Initialise l'url à partir de laquelle le fichier sera récupéré,
      * l'interpréteur de ce fichier et connecte le signal de fin du
      * téléchargement au slot d'extraction de données.
      *
      * @param[in] quoi type de fichier ("agency", "contracts", ...).
      * @param[in] user nom de l'agence.
      * @param[in] mdp mot de passe API de l'utilisateur.
      * @param[in] parent pointeur sur le QObject parent.
      */
    TraitementRequete( const QString& quoi, const QString& user,
                       const QString& mdp, QObject * parent = 0 );
    /** Destructeur.
      * Le destructeur n'a rien de spécial à faire.
      */
    virtual ~TraitementRequete();
    /** Permet d'accéder à Donnees.
      *
      * @return le pointeur Donnees.
      */
    const StructureDonnees* donnees() const;
protected slots:
    /** Slot réalisant la lecture de la réponse réseau.
      * Cette méthode traite la réponse réseau, et lit les données pour autant
      * qu'aucune erreur ne soit présente.
      *
      * On utilise une instance de @c InterpreteXml pour réaliser la lecture.
      *
      * @emits le signal envoieTexte( const StructureDonnees * ) en cas de
      * succès.
      *
      * @param[in] statut le statut de la requête réseau.
      */
    void litTexte( const QNetworkReply::NetworkError& statut );
protected:
    /** Type de contenu à télécharger ("agency", "contracts", ...).
      */
    QString TypeFichier;
    /** Nom de l'agence.
      */
    QString Username;
    /** Mot de passe API de l'agence.
      */
    QString MotDePasse;
    /** Membre qui permet de réaliser le téléchargement proprement dit.
      */
    RapporteurDeFichier * Recup;
    /** Membre qui permet de traiter le fichier télécharger et extrait les
      * informations nécessaire.
      */
    InterpreteXml * Lecteur;
    /** Membre qui contient les données récupérées.
      */
    StructureDonnees * Donnees;
private:
    /** Url de base de l'API croquemonster, utilisée pour construire l'url
      * complète de téléchargement.
      */
    static const QString BaseUrl;
signals:
    /** Signal envoyé par litTexte une fois les données correctement lues.
      *
      * @param[out] infos pointeur sur les données récupérées.
      */
    void envoieTexte( const StructureDonnees* infos );
};

#endif // TRAITEMENTREQUETE_HPP
